package com.example.demo.java8.stream.parallel;

import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;

/**
 *
 * 并行流框架
 *
 * Stream具有平行处理能力，处理的过程会分而治之，
 * 也就是将一个大任务切分成多个小任务，这表示每个任务都是一个操作：
 *
 *
 * Java 8为ForkJoinPool添加了一个通用线程池，这个线程池用来处理那些没有被显式提交到任何线程池的任务。
 * 它是ForkJoinPool类型上的一个静态元素，它拥有的默认线程数量等于运行计算机上的处理器数量。
 * 当调用Arrays类上添加的新方法时，自动并行化就会发生。比如用来排序一个数组的并行快速排序，
 * 用来对一个数组中的元素进行并行遍历。自动并行化也被运用在Java 8新添加的Stream API中。

 * @author Roger
 * @since 2021/7/18
 */
public class ParallelTest {

    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        numbers.parallelStream()
                .forEach(System.out::println);
        //如果非得相同可以使用forEachOrdered方法执行终止操作
        List<Integer> numbers1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        numbers.parallelStream()
                .forEachOrdered(System.out::println);
        //这里有一个疑问，如果结果需要有序，是否和我们的并行执行的初衷相悖？
        // 是的，这个场景下明显无需使用并行流，直接用串行流执行即可， 否则性能可能更差，因为最后又强行将所有并行结果进行了排序。

        int num = IntStream.rangeClosed(1, 4000).parallel().sum();
        System.out.println("计算的总数为"+num);
    }

}
